const sqlite3 = require('sqlite3').verbose();
const path = require('path');
const bcrypt = require('bcryptjs');
const moment = require('moment-timezone');

// 数据库文件路径
const dbPath = path.resolve(__dirname, 'boc_management.db');

// 创建数据库连接
const db = new sqlite3.Database(dbPath, (err) => {
  if (err) {
    console.error('数据库连接错误:', err.message);
  } else {
    console.log('已连接到SQLite数据库');
  }
});

// 初始化数据库表结构
const initializeDB = () => {
  // 创建角色表
  db.run(`CREATE TABLE IF NOT EXISTS roles (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL UNIQUE,
    description TEXT,
    created_at TIMESTAMP
  )`, (err) => {
    if (err) {
      console.error('创建角色表失败:', err.message);
      return;
    }

    // 创建用户表
    db.run(`CREATE TABLE IF NOT EXISTS users (
      id INTEGER PRIMARY KEY AUTOINCREMENT,
      username TEXT NOT NULL UNIQUE,
      password TEXT NOT NULL,
      full_name TEXT,
      email TEXT,
      role_id INTEGER,
      created_at TIMESTAMP,
      updated_at TIMESTAMP,
      FOREIGN KEY (role_id) REFERENCES roles(id)
    )`, (err) => {
      if (err) {
        console.error('创建用户表失败:', err.message);
        return;
      }

      // 创建通知表
      db.run(`CREATE TABLE IF NOT EXISTS notifications (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        title TEXT NOT NULL,
        content TEXT NOT NULL,
        sender_id INTEGER NOT NULL,
        recipient_id INTEGER NOT NULL,
        is_read BOOLEAN DEFAULT FALSE,
        recurrence_type TEXT,
        recurrence_interval INTEGER,
        start_datetime DATETIME,
        next_run_time DATETIME,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        FOREIGN KEY (sender_id) REFERENCES users(id),
        FOREIGN KEY (recipient_id) REFERENCES users(id)
      )`, (err) => {
        if (err) {
          console.error('创建通知表失败:', err.message);
          return;
        }

        // 插入默认角色
        db.run(`INSERT OR IGNORE INTO roles (name, description, created_at) VALUES
          ('admin', '系统管理员，拥有所有权限', ?),
          ('payment_manager', '银行支付清算经理，可以发送通知', ?),
          ('employee', '普通员工，可以接收通知', ?)`,
          [
            moment.tz('Asia/Shanghai').toISOString(),
            moment.tz('Asia/Shanghai').toISOString(),
            moment.tz('Asia/Shanghai').toISOString()
          ], (err) => {
          if (err) {
            console.error('插入默认角色失败:', err.message);
            return;
          }

          // 插入默认管理员用户 (密码: admin123)
          const adminPassword = bcrypt.hashSync('admin123', 10);
          db.run(`INSERT OR IGNORE INTO users (username, password, full_name, email, role_id, created_at, updated_at)
              VALUES ('admin', ?, '系统管理员', 'admin@example.com', (SELECT id FROM roles WHERE name = 'admin'), ?, ?)`,
              [
                adminPassword,
                moment.tz('Asia/Shanghai').toISOString(),
                moment.tz('Asia/Shanghai').toISOString()
              ],
            (err) => {
              if (err) {
                console.error('插入管理员用户失败:', err.message);
              } else {
                console.log('默认管理员用户已创建');
              }
            }
          );
        });
      });
    });
  });
};

// 初始化数据库
initializeDB();

// 导出数据库连接
module.exports = db;